AWS WAFの優先度(Priority)だけ任意の値に変える方法

AWS WAFの優先度(Priority)だけ任意の値に変える方法

Clock Icon2024.12.15

しばたです。

AWS WAFを運用していると各ルールの優先度(Priority)だけを変えたい、特定の値に変更したい場合があるかと思います。
単純に優先度の順序を変えたい時だけでなく優先度の値に意味があるケースに対応したい時もあります。

優先度の値に意味がある例

例えばサイバーセキュリティクラウド社が提供するWafCharmでは、WafCharmのサービスが独自にAWS WAFのルールグループとルールを自動生成しその種類に応じて優先度の値が固定で決められています。

https://www.wafcharm.com/jp/

下図は私の検証AWSアカウントで作成したWafCharm導入済みのAWS WAF環境ですが、WafCharmのルールが優先度101~421を固定的に使用しているのが分かります。

how-to-change-only-the-priority-of-aws-waf-01
WafCharmが自動生成するルールは必ずPriority 101~421を使う

マネジメントコンソールからの操作で困るケース

上図の様な環境に独自のルールを追加したい場合、マネジメントコンソールから操作すると優先度が意図しない値になる事があります。

例えば独自ルール追加しようとすると優先度のデフォルトは既存の最大値 + 1になりますが、

how-to-change-only-the-priority-of-aws-waf-02
新規追加するルールのデフォルト優先度は「既存の最大値+1」

この値を直接変更してしまえば意図通りの値(優先度 = 1)にすることができます。

how-to-change-only-the-priority-of-aws-waf-03
JSONの値を直接変更することは可能

how-to-change-only-the-priority-of-aws-waf-04
意図通り test-rule-01 の優先度を 1 に設定

ただ、マネージドルールを追加する場合はJSONを直接変更することができず、

how-to-change-only-the-priority-of-aws-waf-05
マネージドルールはJSONで編集不可

マネージドルールのUIから優先度を組み替えてしまうと既存ルールの優先度がズレる挙動をします。

how-to-change-only-the-priority-of-aws-waf-06
マネジメントコンソールのUIで優先順位を指定するしかない

結果、下図の様に追加したマネージドルールAWS-AWSManagedRulesAdminProtectionRuleSetの優先度が101になりWafCharmのルールで使っていた優先度を奪う形になってしまいます。
(さらに既存ルールの優先度もずれてしまいます...)

how-to-change-only-the-priority-of-aws-waf-07
意図とは異なり優先度101が使われ、既存WafCharmルールの優先度がずれてしまう

WafCharmではルールの優先度に意味があるため、他のルールで指定の優先度を使ってしまうと設定変更時にエラーとなってしまいます。

このため既存ルールの優先度だけを任意の値に変える必要があります。

AWS WAFの優先度だけ任意の値に変える方法

残念ながらマネジメントコンソールからAWS WAFの優先度だけを任意の値に変えることはできません。
これまでの解説通りマネジメントコンソールの操作では既存ルールに設定済みの優先度を組み替える挙動となります。

このためAWS CLI(か各種言語のSDK)で操作してやる必要があります。

AWS CLIだとaws wafv2 update-web-aclコマンドでWEB ACLのルール全体を更新する必要があります。
優先度の組み換えだけを行う丁度良いAPIはありませんでした...

このコマンドではWEB ACLの各種設定を変更できますが、ルールだけ変える場合でも必ず次のパラメーターを指定する必要があります。

  • --name : WEB ACL名
  • --scope : WEB ACLのスコープ (CLOUDFRONT or REGIONAL)
  • --id : WEB ACLのID
  • --rules : WEB ACLのルール一式 (JSON)
  • --default-action : デフォルトアクション (JSON)
  • --visibility-config : WAF全体のVisiblity config (JSON)
  • --lock-token : ロックトークン

更新したい--rules以外に--default-action--visibility-configの指定も必須となります。
これらのパラメーターのほとんどは変更不要なのでaws wafv2 get-web-aclコマンドから取得してそのまま使ってやります。

簡単に処理をまとめると以下の様にすると必要な情報を取得できます。

Bash on CloudShellで実行する場合
# WAB ACLの情報を指定
acl_scope=REGIONAL
acl_name=your-acl-name
acl_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

#
# aws wafv2 get-web-acl コマンドで現在の情報を取得
#
# ロックトークン
lock_token=$(aws wafv2 get-web-acl \
    --scope $acl_scope --name $acl_name --id $acl_id \
    --query "LockToken" --output text)

# ルール一覧
aws wafv2 get-web-acl \
    --scope $acl_scope --name $acl_name --id $acl_id \
    --query "WebACL.Rules" --output json > ./Rules.json

# デフォルトアクション
aws wafv2 get-web-acl \
    --scope $acl_scope --name $acl_name --id $acl_id \
    --query "WebACL.DefaultAction" --output json > ./DefaultAction.json

# WAF全体のVisiblity config
aws wafv2 get-web-acl \
    --scope $acl_scope --name $acl_name --id $acl_id \
    --query "WebACL.VisibilityConfig" --output json > ./VisibilityConfig.json

取得した結果は環境によって異なりますが、ざっくりこんな感じの値になります。

ロックトークン
$ echo $lock_token 
d3c5e9af-f18a-49f7-b290-a6809425638f
Rules.json
[
    {
        "Name": "test-rule-01",
        "Priority": 1,
        "Statement": {
            // ・・・省略・・・
        },
        "Action": {
            "Block": {}
        },
        "VisibilityConfig": {
            "SampledRequestsEnabled": true,
            "CloudWatchMetricsEnabled": true,
            "MetricName": "test-rule-01"
        }
    },
    {
        "Name": "AWS-AWSManagedRulesAdminProtectionRuleSet",
        "Priority": 101,
        "Statement": {
            // ・・・省略・・・
        },
        "OverrideAction": {
            "None": {}
        },
        "VisibilityConfig": {
            "SampledRequestsEnabled": true,
            "CloudWatchMetricsEnabled": true,
            "MetricName": "AWS-AWSManagedRulesAdminProtectionRuleSet"
        }
    },
//
// ・・・省略・・・
//
    {
        "Name": "WafCharm_UseCase_Regex_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_xxxxxxxxxxxx",
        "Priority": 422,
        "Statement": {
            // ・・・省略・・・
        },
        "OverrideAction": {
            "None": {}
        },
        "VisibilityConfig": {
            // ・・・省略・・・
        }
    }
]
DefaultAction.json
{
    "Allow": {}
}
VisibilityConfig.json
{
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "your-acl-name"
}

ここでRule.jsonに記述されている"Priority": 101等の優先度だけを更新します。

Bash on CloudShellで実行する場合
# 比較用に .orig ファイルを用意
cp Rules.json Rules.json.orig

#
# 手作業でRule.jsonのPriorityだけ更新
#

# 差分を比較
diff -u Rules.json.orig Rules.json

diffの結果はこんな感じです。

diffの結果を一部抜粋
$ diff -u Rules.json.orig Rules.json
--- Rules.json.orig     2024-12-15 14:00:59.188576376 +0000
+++ Rules.json  2024-12-15 14:05:27.280852106 +0000
@@ -30,7 +30,7 @@
     },
     {
         "Name": "AWS-AWSManagedRulesAdminProtectionRuleSet",
-        "Priority": 101,
+        "Priority": 2,
         "Statement": {
             "ManagedRuleGroupStatement": {
                 "VendorName": "AWS",
@@ -48,7 +48,7 @@
     },
     {
         "Name": "WafCharm_Bypass_Bot_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_xxxxxxxxxxxxx",
-        "Priority": 111,
+        "Priority": 101,
         "Statement": {
             "RuleGroupReferenceStatement": {
                 "ARN": "arn:aws:wafv2:ap-northeast-1:xxxxxxxxxxxxx:regional/rulegroup/WafCharm_Bypass_Bot_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_xxxxxxxxxxxxx/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
@@ -65,7 +65,7 @@
     },
     {
         "Name": "WafCharm_Bypass_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_xxxxxxxxxxxxx",
-        "Priority": 201,
+        "Priority": 111,
         "Statement": {
             "RuleGroupReferenceStatement": {
                 "ARN": "arn:aws:wafv2:ap-northeast-1:xxxxxxxxxxxxx:regional/rulegroup/WafCharm_Bypass_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_xxxxxxxxxxxxx/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
#
#・・・省略・・・
#
@@ -376,7 +376,7 @@
     },
     {
         "Name": "WafCharm_UseCase_Regex_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_xxxxxxxxxxxxx",
-        "Priority": 422,
+        "Priority": 421,
         "Statement": {
             "RuleGroupReferenceStatement": {
                 "ARN": "arn:aws:wafv2:ap-northeast-1:xxxxxxxxxxxxx:regional/rulegroup/WafCharm_UseCase_Regex_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_xxxxxxxxxxxxx/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

優先度以外は一切変えないのがポイントです。
ちなみに個別のルールグループ内の優先度もPriorityプロパティなので不要な場所を変更してしまわない様に気をつけてください。

この状態でaws wafv2 update-web-aclを実行してやれば優先度だけ更新[1]することができます。

Bash on CloudShellで実行する場合
# 各種JSONを使いWEB ACLを更新
aws wafv2 update-web-acl \
    --scope $acl_scope --name $acl_name --id $acl_id \
    --rules file://Rules.json \
    --default-action file://DefaultAction.json \
    --visibility-config file://VisibilityConfig.json \
    --lock-token $lock_token

結果、期待通りに優先度だけ更新することができました。

how-to-change-only-the-priority-of-aws-waf-08

最後に各種JSONファイルを削除してやれば後始末も完了です。

Bash on CloudShellで実行する場合
# 各種JSONを削除して後始末
rm VisibilityConfig.json
rm DefaultAction.json
rm Rules.json
rm Rules.json.orig

余談 : WafCharmでは利用者の独自ルールを優先度0~99にする必要がある

WafCharmの仕様の話なのですが、WafCharmでは自動生成されるルールより低い優先度(優先度421以上)の独自ルールを設定してはいけません。
利用者の独自ルールは優先度0~99にする必要があります。

WafCharm自体の検証などで一時的に優先度の調整が必要となる場合はサイバーセキュリティクラウド社のサポートに問い合わせて指示を仰いでください。

最後に

以上となります。

意外と欲しい情報がネット上に存在せず苦労しました。
本記事の内容が皆さんの役に立てば幸いです。

脚注
  1. 正確には優先度以外は従来の値を維持して更新 ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.